#include<iostream>
#include<cassert>
#include<cstring>
#include<signal.h>
#include<unistd.h>

using namespace std;

static void DisplayPending(const sigset_t pending)
{
    // 打印 pending 表
    cout << "当前进程的 pending 表为: ";
    int i = 1;
    while (i < 32)
    {
        if (sigismember(&pending, i))
            cout << "1";
        else
            cout << "0";

        i++;
    }
    cout << endl;
}

static void handler(int signo)
{
    cout<<signo<<" 号信号确实递达了"<<endl; //最终不退出进程

    int n=10;
    while(n--)
    {
        //获取进程的未决信号集
        sigset_t pending;
        sigemptyset(&pending);

        int ret=sigpending(&pending);
        assert(ret == 0);
        (void)ret;

        DisplayPending(pending);
        sleep(1);
    }


}

int main()
{
    cout<<"当前进程: "<<getpid()<<endl;

    //使用sigaction函数
    struct sigaction act,oldact;

    //初始化结构体
    memset(&act,0,sizeof(act));
    memset(&oldact,0,sizeof(oldact));

    //初始化 自定义动作
    act.sa_handler =handler;

    //初始化 屏蔽信号集合
    sigaddset(&act.sa_mask,3);
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);

    //给2号信息注册自定义动作
    sigaction(2,&act,&oldact);

    //死循环
    while(true);

    return 0;


}